/***************************************************
 @Name :        小铭同学
 @Time :        2025-09-03
 @Email :       LiaoMingWJ233@163.com
 @Comment :     TCP服务器
 @FileName :    widget.cpp
 @Version :     1.0
****************************************************/


#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , tcpServer(nullptr)
    , clientSocket(nullptr)
{
    ui->setupUi(this);
    
    ui->exit->raise();
    PushButton_Tcp(ui->exit);
    
    ui->label_bj1->setPixmap(QPixmap(":/TCPbj"));

    ui->label_2->setFont(QFont("楷体",20));
    ui->label_2->setStyleSheet("color: #e056c4; font-weight: bold;");

    ui->label_3->setFont(QFont("楷体",20));
    ui->label_3->setStyleSheet("color: #e056c4; font-weight: bold;");

    // 初始化GBK编解码器
    m_gbkCodec = QTextCodec::codecForName("GBK");
    if (!m_gbkCodec) {
        qDebug() << "Warning: GBK codec not available!";
    }

    // 初始化TCP服务器对象
    tcpServer = new QTcpServer(this);

    // 连接信号和槽函数
    connect(tcpServer, &QTcpServer::newConnection, this, &Widget::onNewConnection);
    connect(ui->sendButton, &QPushButton::clicked, this, &Widget::onSendButtonClicked);

    connect(ui->pushButton_LED_D2, &QPushButton::clicked, this, [this]() {Send("LED_D2");}); //
    connect(ui->pushButton_G, &QPushButton::clicked, this, [this]() {Send("GG");});
    connect(ui->pushButton_S, &QPushButton::clicked, this, [this]() {Send("SS");});
    connect(ui->pushButton_A, &QPushButton::clicked, this, [this]() {Send("AA");});
    connect(ui->pushButton_H, &QPushButton::clicked, this, [this]() {Send("HH");});
    connect(ui->pushButton_L, &QPushButton::clicked, this, [this]() {Send("LL");});
    connect(ui->pushButton_R, &QPushButton::clicked, this, [this]() {Send("RR");});
    connect(ui->pushButton_W, &QPushButton::clicked, this, [this]() {Send("WW");});
    connect(ui->pushButton_K, &QPushButton::clicked, this, [this]() {Send("KK");});
    connect(ui->pushButton_N, &QPushButton::clicked, this, [this]() {Send("NN");});

    PushButton_Tcp(ui->pushButton_LED_D2);
    PushButton_Tcp(ui->pushButton_G);
    PushButton_Tcp(ui->pushButton_S);
    PushButton_Tcp(ui->pushButton_A);
    PushButton_Tcp(ui->pushButton_H);
    PushButton_Tcp(ui->pushButton_L);

    PushButton_Tcp(ui->pushButton_R);
    PushButton_Tcp(ui->pushButton_W);
    PushButton_Tcp(ui->pushButton_K);
    PushButton_Tcp(ui->pushButton_N);
    PushButton_Tcp(ui->sendButton);
    PushButton_Tcp(ui->startButton);

    // 连接启动/停止服务器按钮
    connect(ui->startButton, &QPushButton::clicked, this, [this]() {
        if (tcpServer->isListening()) {
            stopServer();
        } else {
            startServer();
        }
    });

    // 设置QTextEdit的占位符文本
    ui->textEdit->setPlaceholderText("请输入要发送的数据...\n支持多行文本输入");

    // 设置QTextEdit的一些属性
    ui->textEdit->setAcceptRichText(false);    // 不接受富文本
    ui->textEdit->setTabChangesFocus(true);    // Tab键切换焦点，而不是插入制表

    // 初始化界面显示
    ui->portSpinBox->setValue(8080);           // 设置默认端口为8080
    ui->label_3->setText("服务器未启动");       // 初始化状态显示
    ui->label_3->setStyleSheet("color: red;"); // 设置状态文字颜色为红色

    updateServerStatus("服务器未启动");         // 更新详细状态信息

    // 设置窗口属性以适应嵌入式环境
    this->setWindowTitle("TCP服务器 - Buildroot版本");
}

Widget::~Widget()
{
    // 析构函数：停止服务器并清理资源
    stopServer();
    delete ui;
}

void Widget::startServer()
{
    if (tcpServer->isListening()) {
        return;
    }

    quint16 port = static_cast<quint16>(ui->portSpinBox->value());

    if (!tcpServer->listen(QHostAddress::Any, port)) {
        QMessageBox::critical(this, "错误", "无法启动服务器: " + tcpServer->errorString());
        updateServerStatus("启动失败: " + tcpServer->errorString());
        return;
    }

    // 获取并显示所有可用的IP地址
    QString ipInfo = "服务器IP地址:\n";
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();

    for (const QHostAddress &address : ipAddressesList) {
        if (address.protocol() == QAbstractSocket::IPv4Protocol &&
            address != QHostAddress::LocalHost) {
            ipInfo += QString("  - %1\n").arg(address.toString());
        }
    }
    ipInfo += QString("  - 127.0.0.1 (本地回环)\n");
    ipInfo += QString("监听端口: %1").arg(port);

    updateServerStatus(ipInfo);
    ui->startButton->setText("停止服务器");
    ui->label_3->setText("服务器运行中");
    ui->label_3->setStyleSheet("color: green;");

    qDebug() << "服务器启动成功:" << ipInfo;
}

void Widget::stopServer()
{
    // 停止TCP服务器
    if (tcpServer->isListening()) {
        tcpServer->close(); // 关闭服务器监听
    }

    // 断开所有客户端连接并清理资源
    for (QTcpSocket *socket : clientSockets) {
        socket->disconnectFromHost(); // 断开连接
        if (socket->state() == QAbstractSocket::ConnectedState) {
            socket->waitForDisconnected(1000); // 等待断开完成
        }
        socket->deleteLater(); // 延迟删除对象
    }
    clientSockets.clear();    // 清空客户端列表
    clientSocket = nullptr;   // 重置当前客户端指针

    // 更新界面显示
    updateServerStatus("服务器已停止");
    ui->startButton->setText("启动服务器");    // 更改按钮文字
    ui->label_3->setText("服务器已停止");      // 更新状态标签
    ui->label_3->setStyleSheet("color: red;"); // 设置状态文字颜色为红色
}

void Widget::onNewConnection()
{
    // 处理新客户端连接
    QTcpSocket *socket = tcpServer->nextPendingConnection();
    if (!socket) {
        return; // 如果没有获取到有效的socket，直接返回
    }

    // 将新客户端添加到列表
    clientSockets.append(socket);
    clientSocket = socket; // 设置当前客户端

    // 连接客户端socket的信号到对应的槽函数
    connect(socket, &QTcpSocket::readyRead, this, &Widget::onReadyRead);
    connect(socket, &QTcpSocket::disconnected, this, &Widget::onClientDisconnected);
    connect(socket, &QTcpSocket::stateChanged, this, &Widget::onServerStateChanged);

    // 获取客户端信息
    QString clientInfo = QString("客户端连接: %1:%2")
                         .arg(socket->peerAddress().toString())
                         .arg(socket->peerPort());

    // 更新界面显示
    updateServerStatus(clientInfo);
    ui->label_3->setText("客户端已连接");
    ui->label_3->setStyleSheet("color: blue;"); // 设置状态文字颜色为蓝色
}

void Widget::onReadyRead()
{
    // 读取客户端发送的数据
    QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
    if (!socket) {
        return; // 如果sender不是QTcpSocket，直接返回
    }

    // 读取所有可用数据
    QByteArray data = socket->readAll();

    // 【核心修改】使用GBK编码解码数据
    QTextCodec *gbkCodec = QTextCodec::codecForName("GBK");
    if (!gbkCodec) {
        qDebug() << "Error: GBK codec not available!";
        return;
    }
    QString receivedData = gbkCodec->toUnicode(data);

    // 格式化显示文本：添加时间戳
    QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");
    QString displayText = QString("[%1] 接收: %2")
                         .arg(timestamp)
                         .arg(receivedData);


    // 在label_2中显示接收到的数据
    ui->label_2->setText(receivedData);
    //ui->label_2->setText(displayText);
    qDebug() << receivedData;

    // 在状态信息中显示接收到的数据
    updateServerStatus("收到数据: " + receivedData);
}

void Widget::onSendButtonClicked()
{
    // 处理发送按钮点击事件
    if (clientSockets.isEmpty()) {
        QMessageBox::warning(this, "警告", "没有客户端连接");
        return; // 如果没有客户端连接，显示警告并返回
    }

    // 获取要发送的数据（从textEdit）
    QString message = ui->textEdit->toPlainText().toUtf8();  // 使用toPlainText()获取纯文本
    if (message.isEmpty()) {
        QMessageBox::warning(this, "警告", "发送内容不能为空");
        return; // 如果发送内容为空，显示警告并返回
    }

    // 向所有连接的客户端发送数据
    for (QTcpSocket *socket : clientSockets) {
        if (socket->state() == QAbstractSocket::ConnectedState) {
            socket->write(message.toUtf8()); // 发送数据
            socket->flush();                 // 立即发送缓冲区数据
        }
    }
    qDebug() << message;
    // 更新状态信息
    updateServerStatus("数据已发送: " + message);

    // 在label_2中显示发送确认信息
    ui->label_2->setText(message);
    //QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");
    //ui->label_2->setText(QString("[%1] 已发送: %2").arg(timestamp).arg(message));

    // 清空输入框（可选）
    //ui->textEdit->clear();
}

void Widget::onClientDisconnected()
{
    // 处理客户端断开连接
    QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
    if (socket) {
        // 从客户端列表中移除
        clientSockets.removeOne(socket);
        socket->deleteLater(); // 延迟删除对象

        // 如果没有客户端连接，重置当前客户端指针
        if (clientSockets.isEmpty()) {
            clientSocket = nullptr;
            ui->label_3->setText("等待客户端连接");
            ui->label_3->setStyleSheet("color: orange;"); // 设置状态文字颜色为橙色
        }

        // 更新状态信息
        updateServerStatus("客户端断开连接");
    }
}

void Widget::onServerStateChanged(QAbstractSocket::SocketState state)
{
    // 处理服务器状态变化
    QString stateText;

    // 根据状态值转换为对应的文字描述
    switch (state) {
    case QAbstractSocket::UnconnectedState: stateText = "未连接"; break;
    case QAbstractSocket::HostLookupState: stateText = "正在查找主机"; break;
    case QAbstractSocket::ConnectingState: stateText = "正在连接"; break;
    case QAbstractSocket::ConnectedState: stateText = "已连接"; break;
    case QAbstractSocket::BoundState: stateText = "已绑定"; break;
    case QAbstractSocket::ListeningState: stateText = "正在监听"; break;
    case QAbstractSocket::ClosingState: stateText = "正在关闭"; break;
    default: stateText = "未知状态"; break;
    }

    // 在label_3中更新状态显示
    ui->label_3->setText("状态: " + stateText);
}

void Widget::updateServerStatus(const QString &status)
{
    // 更新服务器状态显示（假设有一个statusLabel用于显示详细状态）
    QString currentText = ui->statusLabel->text();
    QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");
    QString newStatus = QString("[%1] %2\n").arg(timestamp).arg(status);

    // 保持最近10条状态记录
    QStringList lines = currentText.split('\n', Qt::SkipEmptyParts);
    if (lines.size() >= 10) {
        lines.removeFirst(); // 移除最旧的一条记录
    }
    lines.append(newStatus.trimmed());

    // 更新显示
    ui->statusLabel->setFont(QFont("楷体",20));
    ui->statusLabel->setStyleSheet("color: #e056c4; font-weight: bold;");
    ui->statusLabel->setText(lines.join('\n'));
}

void Widget::on_exit_clicked()
{
    this->close();
    QApplication::quit();
}

void Widget::Send(QString message)
{
    if (clientSockets.isEmpty()) {
        QMessageBox::warning(this, "警告", "没有客户端连接");
        return; // 如果没有客户端连接，显示警告并返回
    }

    // 向所有连接的客户端发送数据
    for (QTcpSocket *socket : clientSockets) {
        if (socket->state() == QAbstractSocket::ConnectedState) {
            socket->write(message.toUtf8()); // 发送数据
            socket->flush();                 // 立即发送缓冲区数据
        }
    }
    qDebug() << message;
    // 更新状态信息
    updateServerStatus("数据已发送: " + message);

    // 在label_2中显示发送确认信息
    ui->label_2->setText(message);
    //QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");
    //ui->label_2->setText(QString("[%1] 已发送: %2").arg(timestamp).arg(message));
}

void Widget::PushButton_Tcp(QPushButton* PushButton)
{
    PushButton->setStyleSheet(R"(
                              QPushButton {
                              background-color: #4285f4;
                              color: white;
                              border-radius: 15px;
                              border: none;
                              padding: 4px 4px;
                              font-size: 20px;
                              font-weight: bold;
                              font-family: "楷体";
                              }
                              QPushButton:hover {
                              background-color: #3367d6;
                              }
                              QPushButton:pressed {
                              background-color: #2a56c6;
                              }
                              )");      // padding: 4px 4px; 内边距 - 上下4px，左右4px
}
